home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 January / PCWorld_2007-01_cd.bin / v cisle / autoit / autoit-v3.2.0.1-setup.exe / Include / Array.au3 < prev    next >
Text File  |  2006-06-20  |  27KB  |  810 lines

  1. ; Include Version:1.63 (19 June 2006)
  2. #include-once
  3.  
  4. ; ------------------------------------------------------------------------------
  5. ;
  6. ; AutoIt Version: 3.0
  7. ; Language:       English
  8. ; Description:    Functions that assist with array management.
  9. ;
  10. ; Apr 28, 2005 - Fixed _ArrayTrim(): $iTrimDirection test.
  11. ; ------------------------------------------------------------------------------
  12.  
  13.  
  14.  
  15.  
  16. ;===============================================================================
  17. ;
  18. ; Function Name:  _ArrayAdd()
  19. ; Description:    Adds a specified value at the end of an array, returning the
  20. ;                 adjusted array.
  21. ; Author(s):      Jos van der Zande <jdeb at autoitscript dot com>
  22. ;
  23. ;===============================================================================
  24. Func _ArrayAdd(ByRef $avArray, $sValue)
  25.     If IsArray($avArray) Then
  26.         ReDim $avArray[UBound($avArray) + 1]
  27.         $avArray[UBound($avArray) - 1] = $sValue
  28.         SetError(0)
  29.         Return 1
  30.     Else
  31.         SetError(1)
  32.         Return 0
  33.     EndIf
  34. EndFunc   ;==>_ArrayAdd
  35.  
  36.  
  37. ;===============================================================================
  38. ;
  39. ; Function Name:  _ArrayBinarySearch()
  40. ; Description:    Uses the binary search algorithm to search through a
  41. ;                 1-dimensional array.
  42. ; Author(s):      Jos van der Zande <jdeb at autoitscript dot com>
  43. ;
  44. ;===============================================================================
  45. Func _ArrayBinarySearch(ByRef $avArray, $sKey, $i_Base = 0)
  46.     Local $iLwrLimit = $i_Base
  47.     Local $iUprLimit
  48.     Local $iMidElement
  49.     
  50.     If (Not IsArray($avArray)) Then
  51.         SetError(1)
  52.         Return ""
  53.     EndIf
  54.     $iUprLimit = UBound($avArray) - 1
  55.     $iMidElement = Int( ($iUprLimit + $iLwrLimit) / 2)
  56.     ; sKey is smaller than the first entry
  57.     If $avArray[$iLwrLimit] > $sKey Or $avArray[$iUprLimit] < $sKey Then
  58.         SetError(2)
  59.         Return ""
  60.     EndIf
  61.     
  62.     While $iLwrLimit <= $iMidElement And $sKey <> $avArray[$iMidElement]
  63.         If $sKey < $avArray[$iMidElement] Then
  64.             $iUprLimit = $iMidElement - 1
  65.         Else
  66.             $iLwrLimit = $iMidElement + 1
  67.         EndIf
  68.         $iMidElement = Int( ($iUprLimit + $iLwrLimit) / 2)
  69.     WEnd
  70.     If $iLwrLimit > $iUprLimit Then
  71.         ; Entry not found
  72.         SetError(3)
  73.         Return ""
  74.     Else
  75.         ;Entry found , return the index
  76.         SetError(0)
  77.         Return $iMidElement
  78.     EndIf
  79. EndFunc   ;==>_ArrayBinarySearch
  80.  
  81. ;===============================================================================
  82. ;
  83. ; Function Name:    _ArrayCreate()
  84. ; Description:      Create a small array and quickly assign values.
  85. ; Parameter(s):     $v_0  - The first element of the array.
  86. ;                   $v_1  - The second element of the array (optional).
  87. ;                   ...
  88. ;                   $v_20 - The twentyfirst element of the array (optional).
  89. ; Requirement(s):   None.
  90. ; Return Value(s):  The array with values.
  91. ; Author(s):        Dale (Klaatu) Thompson
  92. ; Note(s):          None.
  93. ;
  94. ;===============================================================================
  95. Func _ArrayCreate($v_0, $v_1 = 0, $v_2 = 0, $v_3 = 0, $v_4 = 0, $v_5 = 0, $v_6 = 0, $v_7 = 0, $v_8 = 0, $v_9 = 0, $v_10 = 0, $v_11 = 0, $v_12 = 0, $v_13 = 0, $v_14 = 0, $v_15 = 0, $v_16 = 0, $v_17 = 0, $v_18 = 0, $v_19 = 0, $v_20 = 0)
  96.     
  97.     Local $i_UBound = @NumParams
  98.     Local $av_Array[$i_UBound]
  99.     Local $i_Index
  100.  
  101.     For $i_Index = 0 To ($i_UBound - 1)
  102.         $av_Array[$i_Index] = Eval("v_" & String($i_Index))
  103.     Next
  104.     Return $av_Array
  105.     ; Create fake usage for the variables to suppress Au3Check -w 6
  106.     $v_0 = $v_0 = $v_1 = $v_2 = $v_3 = $v_4 = $v_5 = $v_6 = $v_7 = $v_8 = $v_9 = $v_10
  107.     $v_11 = $v_11 = $v_12 = $v_13 = $v_14 = $v_15 = $v_16 = $v_17 = $v_18 = $v_19 = $v_20
  108. EndFunc   ;==>_ArrayCreate
  109.  
  110.  
  111. ;===============================================================================
  112. ;
  113. ; Function Name:  _ArrayDelete()
  114. ; Description:    Deletes the specified element from the given array, returning
  115. ;                 the adjusted array.
  116. ; Author(s)       Cephas <cephas at clergy dot net>
  117. ; Modifications   Array is passed via Byref  - Jos van der zande
  118. ;===============================================================================
  119. Func _ArrayDelete(ByRef $avArray, $iElement)
  120.     Local $iCntr = 0, $iUpper = 0
  121.     
  122.     If (Not IsArray($avArray)) Then
  123.         SetError(1)
  124.         Return ""
  125.     EndIf
  126.     
  127.     ; We have to define this here so that we're sure that $avArray is an array
  128.     ; before we get it's size.
  129.     $iUpper = UBound($avArray)    ; Size of original array
  130.     
  131.     ; If the array is only 1 element in size then we can't delete the 1 element.
  132.     If $iUpper = 1 Then
  133.         SetError(2)
  134.         Return ""
  135.     EndIf
  136.     
  137.     Local $avNewArray[$iUpper - 1]
  138.     If $iElement < 0 Then
  139.         $iElement = 0
  140.     EndIf
  141.     If $iElement > ($iUpper - 1) Then
  142.         $iElement = ($iUpper - 1)
  143.     EndIf
  144.     If $iElement > 0 Then
  145.         For $iCntr = 0 To $iElement - 1
  146.             $avNewArray[$iCntr] = $avArray[$iCntr]
  147.         Next
  148.     EndIf
  149.     If $iElement < ($iUpper - 1) Then
  150.         For $iCntr = ($iElement + 1) To ($iUpper - 1)
  151.             $avNewArray[$iCntr - 1] = $avArray[$iCntr]
  152.         Next
  153.     EndIf
  154.     $avArray = $avNewArray
  155.     SetError(0)
  156.     Return 1
  157. EndFunc   ;==>_ArrayDelete
  158.  
  159.  
  160. ;===============================================================================
  161. ;
  162. ; Function Name:  _ArrayDisplay()
  163. ; Description:    Displays a 1-dimensional array in a message box.
  164. ; Author(s):      Brian Keene <brian_keene at yahoo dot com>
  165. ;
  166. ;===============================================================================
  167. Func _ArrayDisplay(Const ByRef $avArray, $sTitle)
  168.     Local $iCounter = 0, $sMsg = ""
  169.     
  170.     If (Not IsArray($avArray)) Then
  171.         SetError(1)
  172.         Return 0
  173.     EndIf
  174.     
  175.     For $iCounter = 0 To UBound($avArray) - 1
  176.         $sMsg = $sMsg & "[" & $iCounter & "]    = " & StringStripCR($avArray[$iCounter]) & @CR
  177.     Next
  178.     
  179.     MsgBox(4096, $sTitle, $sMsg)
  180.     SetError(0)
  181.     Return 1
  182. EndFunc   ;==>_ArrayDisplay
  183.  
  184.  
  185. ;===============================================================================
  186. ;
  187. ; Function Name:  _ArrayInsert()
  188. ; Description:    Add a new value at the specified position.
  189. ;
  190. ; Author(s):      Jos van der Zande <jdeb at autoitscript dot com>
  191. ;
  192. ;===============================================================================
  193. Func _ArrayInsert(ByRef $avArray, $iElement, $sValue = "")
  194.     Local $iCntr = 0
  195.     
  196.     If Not IsArray($avArray) Then
  197.         SetError(1)
  198.         Return 0
  199.     EndIf
  200.     ; Add 1 to the Array
  201.     ReDim $avArray[UBound($avArray) + 1]
  202.     ; Move all entries one up till the specified Element
  203.     For $iCntr = UBound($avArray) - 1 To $iElement + 1 Step - 1
  204.         $avArray[$iCntr] = $avArray[$iCntr - 1]
  205.     Next
  206.     ; add the value in the specified element
  207.     $avArray[$iCntr] = $sValue
  208.     Return 1
  209. EndFunc   ;==>_ArrayInsert
  210.  
  211.  
  212. ;===============================================================================
  213. ;
  214. ; Function Name:  _ArrayMax()
  215. ; Description:    Returns the highest value held in an array.
  216. ; Author(s):      Cephas <cephas at clergy dot net>
  217. ;
  218. ;                 Jos van der Zande
  219. ; Modified:       Added $iCompNumeric and $i_Base parameters and logic
  220. ;===============================================================================
  221. Func _ArrayMax(Const Byref $avArray, $iCompNumeric = 0, $i_Base = 0)
  222.     If IsArray($avArray) Then
  223.         Return $avArray[_ArrayMaxIndex($avArray, $iCompNumeric, $i_Base) ]
  224.     Else
  225.         SetError(1)
  226.         Return ""
  227.     EndIf
  228. EndFunc   ;==>_ArrayMax
  229.  
  230.  
  231. ;===============================================================================
  232. ;
  233. ; Function Name:  _ArrayMaxIndex()
  234. ; Description:    Returns the index where the highest value occurs in the array.
  235. ; Author(s):      Cephas <cephas at clergy dot net>
  236. ;
  237. ;                 Jos van der Zande
  238. ; Modified:       Added $iCompNumeric and $i_Base parameters and logic
  239. ;===============================================================================
  240. Func _ArrayMaxIndex(Const ByRef $avArray, $iCompNumeric = 0, $i_Base = 0)
  241.     Local $iCntr, $iMaxIndex = $i_Base
  242.     
  243.     If Not IsArray($avArray) Then
  244.         SetError(1)
  245.         Return ""
  246.     EndIf
  247.     
  248.     Local $iUpper = UBound($avArray)
  249.     For $iCntr = $i_Base To ($iUpper - 1)
  250.         If $iCompNumeric = 1 Then
  251.             If Number($avArray[$iMaxIndex]) < Number($avArray[$iCntr]) Then
  252.                 $iMaxIndex = $iCntr
  253.             EndIf
  254.         Else
  255.             If $avArray[$iMaxIndex] < $avArray[$iCntr] Then
  256.                 $iMaxIndex = $iCntr
  257.             EndIf
  258.         EndIf
  259.     Next
  260.     SetError(0)
  261.     Return $iMaxIndex
  262. EndFunc   ;==>_ArrayMaxIndex
  263.  
  264.  
  265. ;===============================================================================
  266. ;
  267. ; Function Name:  _ArrayMin()
  268. ; Description:    Returns the lowest value held in an array.
  269. ; Author(s):      Cephas <cephas ay clergy dot net>
  270. ;
  271. ;                 Jos van der Zande
  272. ; Modified:       Added $iCompNumeric and $i_Base parameters and logic
  273. ;===============================================================================
  274. Func _ArrayMin(Const ByRef $avArray, $iCompNumeric = 0, $i_Base = 0)
  275.     If IsArray($avArray) Then
  276.         Return $avArray[_ArrayMinIndex($avArray, $iCompNumeric, $i_Base) ]
  277.     Else
  278.         SetError(1)
  279.         Return ""
  280.     EndIf
  281. EndFunc   ;==>_ArrayMin
  282.  
  283.  
  284. ;===============================================================================
  285. ;
  286. ; Function Name:  _ArrayMinIndex()
  287. ; Description:    Returns the index where the lowest value occurs in the array.
  288. ; Author(s):      Cephas <cephas at clergy dot net>
  289. ;
  290. ;                 Jos van der Zande
  291. ; Modified:       Added $iCompNumeric and $i_Base parameters and logic
  292. ;===============================================================================
  293. Func _ArrayMinIndex(Const ByRef $avArray, $iCompNumeric = 0, $i_Base = 0)
  294.     Local $iCntr = 0, $iMinIndex = $i_Base
  295.     
  296.     If Not IsArray($avArray) Then
  297.         SetError(1)
  298.         Return ""
  299.     EndIf
  300.     
  301.     Local $iUpper = UBound($avArray)
  302.     For $iCntr = $i_Base To ($iUpper - 1)
  303.         If $iCompNumeric = 1 Then
  304.             If Number($avArray[$iMinIndex]) > Number($avArray[$iCntr]) Then
  305.                 $iMinIndex = $iCntr
  306.             EndIf
  307.         Else
  308.             If $avArray[$iMinIndex] > $avArray[$iCntr] Then
  309.                 $iMinIndex = $iCntr
  310.             EndIf
  311.         EndIf
  312.     Next
  313.     SetError(0)
  314.     Return $iMinIndex
  315. EndFunc   ;==>_ArrayMinIndex
  316.  
  317.  
  318. ;===============================================================================
  319. ;
  320. ; Function Name:  _ArrayPop()
  321. ; Description:    Returns the last element of an array, deleting that element
  322. ;                 from the array at the same time.
  323. ; Author(s):      Cephas <cephas at clergy dot net>
  324. ; Modified:       Use Redim to remove last entry.
  325. ;===============================================================================
  326. Func _ArrayPop(ByRef $avArray)
  327.     Local $sLastVal
  328.     If (Not IsArray($avArray)) Then
  329.         SetError(1)
  330.         Return ""
  331.     EndIf
  332.     $sLastVal = $avArray[UBound($avArray) - 1]
  333.     ; remove the last value
  334.     If UBound($avArray) = 1 Then
  335.         $avArray = ""
  336.     Else
  337.         ReDim $avArray[UBound($avArray) - 1]
  338.     EndIf
  339.     ; return last value
  340.     Return $sLastVal
  341. EndFunc   ;==>_ArrayPop
  342.  
  343. ;=====================================================================================
  344. ;
  345. ; Function Name:    _ArrayPush
  346. ; Description:      Add new values without increasing array size.Either by inserting
  347. ;                   at the end the new value and deleting the first one or vice versa.
  348. ; Parameter(s):     $avArray      - Array
  349. ;                   $sValue       - The new value.It can be an array too.
  350. ;                   $i_Direction  - 0 = Leftwise slide (adding at the end) (default)
  351. ;                                   1 = Rightwise slide (adding at the start)
  352. ; Requirement(s):   None
  353. ; Return Value(s):  On Success -  Returns 1
  354. ;                   On Failure -  0 if $avArray is not an array.
  355. ;                                 -1 if $sValue array size is greater than $avArray size.
  356. ;                                 In both cases @error is set to 1.
  357. ; Author(s):        Helias Gerassimou(hgeras)
  358. ;
  359. ;======================================================================================
  360. Func _ArrayPush(ByRef $avArray, $sValue, $i_Direction = 0)
  361.     Local $i, $j
  362.     
  363.     If (Not IsArray($avArray)) Then
  364.         SetError(1)
  365.         Return 0
  366.     EndIf
  367. ;    
  368.     If (Not IsArray($sValue)) Then
  369.         If $i_Direction = 1 Then
  370.             For $i = (UBound($avArray) - 1) To 1 Step -1
  371.                 $avArray[$i] = $avArray[$i - 1]
  372.             Next
  373.             $avArray[0] = $sValue
  374.         Else
  375.             For $i = 0 To (UBound($avArray) - 2)
  376.                 $avArray[$i] = $avArray[$i + 1]
  377.             Next
  378.             $i = (UBound($avArray) - 1)
  379.             $avArray[$i] = $sValue
  380.         EndIf
  381.         ;
  382.         SetError(0)
  383.         Return 1
  384.     Else
  385.         If UBound($sValue) > UBound($avArray) Then
  386.             SetError(1)
  387.             Return -1
  388.         Else
  389.             For $j = 0 to (UBound($sValue) - 1)
  390.                 If $i_Direction = 1 Then
  391.                     For $i = (UBound($avArray) - 1) To 1
  392.                         $avArray[$i] = $avArray[$i - 1]
  393.                     Next
  394.                     $avArray[$j] = $sValue[$j]
  395.                 Else
  396.                     For $i = 0 To (UBound($avArray) - 2)
  397.                         $avArray[$i] = $avArray[$i + 1]
  398.                     Next
  399.                     $i = (UBound($avArray) - 1)
  400.                     $avArray[$i] = $sValue[$j]
  401.                 EndIf
  402.             Next
  403.         EndIf
  404.     EndIf
  405.     ;    
  406.     SetError(0)
  407.     Return 1
  408. ;
  409. EndFunc   ;==>_ArrayPush
  410.  
  411. ;===============================================================================
  412. ;
  413. ; Function Name:  _ArrayReverse()
  414. ; Description:    Takes the given array and reverses the order in which the
  415. ;                 elements appear in the array.
  416. ; Author(s):      Brian Keene <brian_keene at yahoo dot com>
  417. ;                 
  418. ; Modified:       Added $i_Base parameter and logic (Jos van der Zande)
  419. ;                 Added $i_UBound parameter and rewrote it for speed. (Tylo)
  420. ;===============================================================================
  421.  
  422. Func _ArrayReverse(ByRef $avArray, $i_Base = 0, $i_UBound = 0)
  423.     If Not IsArray($avArray) Then
  424.         SetError(1)
  425.         Return 0
  426.     EndIf
  427.     Local $tmp, $last = UBound($avArray) - 1
  428.     If $i_UBound < 1 Or $i_UBound > $last Then $i_UBound = $last
  429.     For $i = $i_Base To $i_Base + Int(($i_UBound - $i_Base - 1) / 2)
  430.         $tmp = $avArray[$i]
  431.         $avArray[$i] = $avArray[$i_UBound]
  432.         $avArray[$i_UBound] = $tmp
  433.         $i_UBound = $i_UBound - 1
  434.     Next
  435.     Return 1
  436. EndFunc  ;==>_ArrayReverse
  437.  
  438. ;===============================================================================
  439. ;
  440. ; Description:      Finds an entry within a one-dimensional array. (Similar to _ArrayBinarySearch() except the array does not need to be sorted.)
  441. ; Syntax:           _ArraySearch($avArray, $vWhat2Find, $iStart = 0, $iEnd = 0,$iCaseSense=0)
  442. ;
  443. ; Parameter(s):      $avArray           = The array to search
  444. ;                    $vWhat2Find        = What to search $avArray for
  445. ;                    $iStart (Optional) = Start array index for search, normally set to 0 or 1. If omitted it is set to 0
  446. ;                    $iEnd  (Optional)  = End array index for search. If omitted or set to 0 it is set to Ubound($AvArray)-
  447. ;                     $iCaseSense (Optional) = If set to 1 then search is case sensitive
  448. ; Requirement(s):   None
  449. ;
  450. ; Return Value(s):  On Success - Returns the position of an item in an array.
  451. ;                   On Failure - Returns an -1 if $vWhat2Find is not found
  452. ;                        @Error=1 $avArray is not an array
  453. ;                        @Error=2 $iStart is greater than UBound($AvArray)-1
  454. ;                        @Error=3 $iEnd is greater than UBound($AvArray)-1
  455. ;                        @Error=4 $iStart is greater than $iEnd
  456. ;                         @Error=5 $iCaseSense was invalid. (Must be 0 or 1)
  457. ;                         @Error=6 $vWhat2Find was not found in $avArray
  458. ;
  459. ; Author(s):        SolidSnake <MetalGearX91 at Hotmail dot com>
  460. ; Note(s):          This might be slower than _ArrayBinarySearch() but is useful when the array's order can't be altered.
  461. ;===============================================================================
  462. Func _ArraySearch(Const ByRef $avArray, $vWhat2Find, $iStart = 0, $iEnd = 0, $iCaseSense = 0)
  463.     Local $iCurrentPos, $iUBound
  464.     If Not IsArray($avArray) Then
  465.         SetError(1)
  466.         Return -1
  467.     EndIf
  468.     $iUBound = UBound($avArray) - 1
  469.     If $iEnd = 0 Then $iEnd = $iUBound
  470.     If $iStart > $iUBound Then
  471.         SetError(2)
  472.         Return -1
  473.     EndIf
  474.     If $iEnd > $iUBound Then
  475.         SetError(3)
  476.         Return -1
  477.     EndIf
  478.     If $iStart > $iEnd Then
  479.         SetError(4)
  480.         Return -1
  481.     EndIf
  482.     If Not ($iCaseSense = 0 Or $iCaseSense = 1) Then
  483.         SetError(5)
  484.         Return -1
  485.     EndIf
  486.     For $iCurrentPos = $iStart To $iEnd
  487.         Select
  488.             Case $iCaseSense = 0
  489.                 If $avArray[$iCurrentPos] = $vWhat2Find Then
  490.                     SetError(0)
  491.                     Return $iCurrentPos
  492.                 EndIf
  493.             Case $iCaseSense = 1
  494.                 If $avArray[$iCurrentPos] == $vWhat2Find Then
  495.                     SetError(0)
  496.                     Return $iCurrentPos
  497.                 EndIf
  498.         EndSelect
  499.     Next
  500.     SetError(6)
  501.     Return -1
  502. EndFunc   ;==>_ArraySearch
  503.  
  504. ;===============================================================================
  505. ;
  506. ; Function Name:    _ArraySort()
  507. ; Description:      Sort an 1 or 2 dimensional Array on a specific index
  508. ;                   using the quicksort/insertsort algorithms.
  509. ; Parameter(s):     $a_Array      - Array
  510. ;                   $i_Descending - Sort Descending when 1
  511. ;                   $i_Base       - Start sorting at this Array entry.
  512. ;                   $I_Ubound     - End sorting at this Array entry.
  513. ;                                   Default UBound($a_Array) - 1
  514. ;                   $i_Dim        - Elements to sort in second dimension
  515. ;                   $i_SortIndex  - The Index to Sort the Array on.
  516. ;                                   (for 2-dimensional arrays only)
  517. ; Requirement(s):   None
  518. ; Return Value(s):  On Success - 1 and the sorted array is set
  519. ;                   On Failure - 0 and sets @ERROR = 1
  520. ; Author(s):        Jos van der Zande <jdeb at autoitscript dot com>
  521. ;                   LazyCoder - added $i_SortIndex option
  522. ;                   Tylo - implemented stable QuickSort algo
  523. ;                   Jos - Changed logic to correctly Sort arrays with mixed Values and Strings
  524. ;
  525. ;===============================================================================
  526. ;
  527. Func _ArraySort(ByRef $a_Array, $i_Decending = 0, $i_Base = 0, $i_UBound = 0, $i_Dim = 1, $i_SortIndex = 0)
  528.   ; Set to ubound when not specified
  529.     If Not IsArray($a_Array) Then
  530.        SetError(1)
  531.        Return 0
  532.     EndIf
  533.     Local $last = UBound($a_Array) - 1
  534.     If $i_UBound < 1 Or $i_UBound > $last Then $i_UBound = $last
  535.     
  536.     If $i_Dim = 1 Then
  537.         __ArrayQSort1($a_Array, $i_Base, $i_UBound)
  538.         If $i_Decending Then _ArrayReverse($a_Array, $i_Base, $i_UBound)
  539.     Else
  540.         __ArrayQSort2($a_Array, $i_Base, $i_UBound, $i_Dim, $i_SortIndex, $i_Decending)
  541.     EndIf
  542.     Return 1
  543. EndFunc;==>_ArraySort
  544.  
  545. ; Private
  546. Func __ArrayQSort1(ByRef $array, ByRef $left, ByRef $right)
  547.     Local $i, $j, $t
  548.     If $right - $left < 10 Then
  549.       ; InsertSort - fastest on small segments (= 25% total speedup)
  550.         For $i = $left + 1 To $right
  551.             $t = $array[$i]
  552.             $j = $i
  553.             While $j > $left _  
  554.                 And (    (IsNumber($array[$j - 1]) = IsNumber($t) And $array[$j - 1] > $t) _
  555.                       Or (IsNumber($array[$j - 1]) <> IsNumber($t) And String($array[$j - 1]) > String($t)))
  556.                 $array[$j] = $array[$j - 1]
  557.                 $j = $j - 1
  558.             Wend
  559.             $array[$j] = $t
  560.         Next
  561.         Return
  562.     EndIf
  563.  
  564.   ; QuickSort - fastest on large segments
  565.     Local $pivot = $array[Int(($left + $right)/2)]
  566.     Local $L = $left
  567.     Local $R = $right
  568.     Do
  569.         While ((IsNumber($array[$L]) = IsNumber($pivot) And $array[$L] < $pivot) _
  570.                 Or (IsNumber($array[$L]) <> IsNumber($pivot) And String($array[$L]) < String($pivot)))
  571.             ;While $array[$L] < $pivot
  572.             $L = $L + 1
  573.         Wend
  574.         While ((IsNumber($array[$R]) = IsNumber($pivot) And $array[$R] > $pivot) _
  575.                 Or (IsNumber($array[$R]) <> IsNumber($pivot) And String($array[$R]) > String($pivot)))
  576.             ;    While $array[$R] > $pivot
  577.             $R = $R - 1
  578.         Wend
  579.       ; Swap
  580.         If $L <= $R Then
  581.             $t = $array[$L]
  582.             $array[$L] = $array[$R]
  583.             $array[$R] = $t
  584.             $L = $L + 1
  585.             $R = $R - 1
  586.         EndIf
  587.     Until $L > $R
  588.         
  589.     __ArrayQSort1($array, $left, $R)
  590.     __ArrayQSort1($array, $L, $right)
  591. EndFunc
  592.  
  593. ; Private
  594. Func __ArrayQSort2(ByRef $array, ByRef $left, ByRef $right, ByRef $dim2, ByRef $sortIdx, ByRef $decend)
  595.     If $left >= $right Then Return
  596.     Local $t, $d2 = $dim2 - 1
  597.     Local $pivot = $array[Int(($left + $right)/2)][$sortIdx]
  598.     Local $L = $left
  599.     Local $R = $right
  600.     Do
  601.         If $decend Then
  602.             While ((IsNumber($array[$L][$sortIdx]) = IsNumber($pivot) And $array[$L][$sortIdx] > $pivot) _
  603.                 Or (IsNumber($array[$L][$sortIdx]) <> IsNumber($pivot) And String($array[$L][$sortIdx]) > String($pivot)))
  604.                 ;While $array[$L][$sortIdx] > $pivot
  605.                 $L = $L + 1
  606.             Wend
  607.             While ((IsNumber($array[$R][$sortIdx]) = IsNumber($pivot) And $array[$R][$sortIdx] < $pivot) _
  608.                 Or (IsNumber($array[$R][$sortIdx]) <> IsNumber($pivot) And String($array[$R][$sortIdx]) < String($pivot)))
  609.                 ;While $array[$R][$sortIdx] < $pivot
  610.                 $R = $R - 1
  611.             Wend
  612.         Else
  613.             While ((IsNumber($array[$L][$sortIdx]) = IsNumber($pivot) And $array[$L][$sortIdx] < $pivot) _
  614.                 Or (IsNumber($array[$L][$sortIdx]) <> IsNumber($pivot) And String($array[$L][$sortIdx]) < String($pivot)))
  615.                 ;While $array[$L][$sortIdx] < $pivot
  616.                 $L = $L + 1
  617.             Wend
  618.             While ((IsNumber($array[$R][$sortIdx]) = IsNumber($pivot) And $array[$R][$sortIdx] > $pivot) _
  619.                 Or (IsNumber($array[$R][$sortIdx]) <> IsNumber($pivot) And String($array[$R][$sortIdx]) > String($pivot)))
  620.                 ;While $array[$R][$sortIdx] > $pivot
  621.                 $R = $R - 1
  622.             Wend
  623.         EndIf
  624.         If $L <= $R Then
  625.             For $x = 0 To $d2
  626.                 $t = $array[$L][$x]
  627.                 $array[$L][$x] = $array[$R][$x]
  628.                 $array[$R][$x] = $t
  629.             Next        
  630.             $L = $L + 1
  631.             $R = $R - 1
  632.         EndIf
  633.     Until $L > $R
  634.         
  635.     __ArrayQSort2($array, $left, $R, $dim2, $sortIdx, $decend)
  636.     __ArrayQSort2($array, $L, $right, $dim2, $sortIdx, $decend)
  637. EndFunc
  638.  
  639.  
  640.  
  641. ;===============================================================================
  642. ;
  643. ; Function Name:  _ArraySwap()
  644. ; Description:    Swaps two elements of an array.
  645. ; Author(s):      David Nuttall <danuttall at rocketmail dot com>
  646. ;
  647. ;===============================================================================
  648. Func _ArraySwap(ByRef $svector1, ByRef $svector2)
  649.     Local $sTemp = $svector1
  650.     
  651.     $svector1 = $svector2
  652.     $svector2 = $sTemp
  653.     
  654.     SetError(0)
  655. EndFunc   ;==>_ArraySwap
  656.  
  657.  
  658. ;===============================================================================
  659. ;
  660. ; Function Name:  _ArrayToClip()
  661. ; Description:    Sends the contents of an array to the clipboard.
  662. ; Author(s):      Cephas <cephas at clergy dot net>
  663. ;
  664. ;                 Jos van der Zande
  665. ; Modified:       Added $i_Base parameter and logic
  666. ;===============================================================================
  667. Func _ArrayToClip(const ByRef $avArray, $i_Base = 0)
  668.     Local $iCntr, $iRetVal = 0, $sCr = "", $sText = ""
  669.     
  670.     If (IsArray($avArray)) Then
  671.         For $iCntr = $i_Base To (UBound($avArray) - 1)
  672.             $iRetVal = 1
  673.             If $iCntr > $i_Base Then
  674.                 $sCr = @CR
  675.             EndIf
  676.             $sText = $sText & $sCr & $avArray[$iCntr]
  677.         Next
  678.     EndIf
  679.     ClipPut($sText)
  680.     Return $iRetVal
  681. EndFunc   ;==>_ArrayToClip
  682.  
  683.  
  684. ;===============================================================================
  685. ;
  686. ; Function Name:  _ArrayToString()
  687. ; Description:    Places the elements of an array into a single string,
  688. ;                 separated by the specified delimiter.
  689. ; Author(s):      Brian Keene <brian_keene at yahoo dot com>
  690. ;
  691. ;===============================================================================
  692. Func _ArrayToString(Const ByRef $avArray, $sDelim, $iStart = 0, $iEnd = 0)
  693.     ; Declare local variables.
  694.     Local $iCntr = 0, $iUBound = 0, $sResult = ""
  695.     
  696.     ; If $avArray is an array then set var for efficiency sake.
  697.     If (IsArray($avArray)) Then
  698.         $iUBound = UBound($avArray) - 1
  699.     EndIf
  700.     If $iEnd = 0 Then $iEnd = $iUBound
  701.     ; Check for parameter validity.
  702.     Select
  703.         Case (Not IsArray($avArray))
  704.             SetError(1)
  705.             Return ""
  706.         Case( ($iUBound + 1) < 2 Or UBound($avArray, 0) > 1)
  707.             SetError(2)
  708.             Return ""
  709.         Case (Not IsInt($iStart))
  710.             SetError(3)
  711.             Return ""
  712.         Case (Not IsInt($iEnd))
  713.             SetError(5)
  714.             Return ""
  715.         Case (Not IsString($sDelim))
  716.             SetError(7)
  717.             Return ""
  718.         Case ($sDelim = "")
  719.             SetError(8)
  720.             Return ""
  721.         Case (StringLen($sDelim) > 1)
  722.             SetError(9)
  723.             Return ""
  724.         Case ($iStart = -1 And $iEnd = -1)
  725.             $iStart = 0
  726.             $iEnd = $iUBound
  727.         Case ($iStart < 0)
  728.             SetError(4)
  729.             Return ""
  730.         Case ($iEnd < 0)
  731.             SetError(6)
  732.             Return ""
  733.     EndSelect
  734.     
  735.     ; Make sure that $iEnd <= to the size of the array.
  736.     If ($iEnd > $iUBound) Then
  737.         $iEnd = $iUBound
  738.     EndIf
  739.     
  740.     ; Combine the elements into the string.
  741.     For $iCntr = $iStart To $iEnd
  742.         $sResult = $sResult & $avArray[$iCntr]
  743.         If ($iCntr < $iEnd) Then
  744.             $sResult = $sResult & $sDelim
  745.         EndIf
  746.     Next
  747.     
  748.     SetError(0)
  749.     Return $sResult
  750. EndFunc   ;==>_ArrayToString
  751.  
  752. ;===============================================================================
  753. ;
  754. ; FunctionName:     _ArrayTrim()
  755. ; Description:      Trims all elements in an array a certain number of characters.
  756. ; Syntax:           _ArrayTrim( $aArray, $iTrimNum , [$iTrimDirection] , [$iBase] , [$iUbound] )
  757. ; Parameter(s):     $aArray              - The array to trim the items of
  758. ;                   $iTrimNum            - The amount of characters to trim
  759. ;                    $iTrimDirection     - 0 to trim left, 1 to trim right
  760. ;                                            [Optional] : Default = 0
  761. ;                   $iBase               - Start trimming at this element in the array
  762. ;                                            [Optional] : Default = 0
  763. ;                   $iUbound             - End trimming at this element in the array
  764. ;                                            [Optional] : Default = Full Array
  765. ; Requirement(s):   None
  766. ; Return Value(s):  1 - If invalid array
  767. ;                   2 - Invalid base boundry parameter
  768. ;                   3 - Invalid end boundry parameter
  769. ;                   4 - If $iTrimDirection is not a zero or a one
  770. ;                    Otherwise it returns the new trimmed array
  771. ; Author(s):        Adam Moore (redndahead)
  772. ; Note(s):          None
  773. ;
  774. ;===============================================================================
  775. Func _ArrayTrim($aArray, $iTrimNum, $iTrimDirection = 0, $iBase = 0, $iUBound = 0)
  776.     Local $i
  777.     
  778.     ;Validate array and options given
  779.     If UBound($aArray) = 0 Then
  780.         SetError(1)
  781.         Return $aArray
  782.     EndIf
  783.     
  784.     If $iBase < 0 Or Not IsNumber($iBase) Then
  785.         SetError(2)
  786.         Return $aArray
  787.     EndIf
  788.     
  789.     If UBound($aArray) <= $iUBound Or Not IsNumber($iUBound) Then
  790.         SetError(3)
  791.         Return $aArray
  792.     EndIf
  793.     
  794.     ; Set to ubound when not specified
  795.     If $iUBound < 1 Then $iUBound = UBound($aArray) - 1
  796.     
  797.     If $iTrimDirection < 0 Or $iTrimDirection > 1 Then
  798.         SetError(4)
  799.         Return
  800.     EndIf
  801.     ;Trim it off
  802.     For $i = $iBase To $iUBound
  803.         If $iTrimDirection = 0 Then
  804.             $aArray[$i] = StringTrimLeft($aArray[$i], $iTrimNum)
  805.         Else
  806.             $aArray[$i] = StringTrimRight($aArray[$i], $iTrimNum)
  807.         EndIf
  808.     Next
  809.     Return $aArray
  810. EndFunc   ;==>_ArrayTrim